package com.example.daibanshiwu.controller;

import com.example.daibanshiwu.Service.MatterService;
import com.example.daibanshiwu.mapper.MatterMapper;
import com.example.daibanshiwu.pojo.*;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.List;


@RestController
@RequestMapping("/matter")
public class Matter {

    @Autowired
    private MatterService matterService;

//  查询待办的事务
    @GetMapping("/getMessage")
    List<Message> getMessage(@RequestParam("receiverUserId") int receiverUserId){
        List<Message> listM=matterService.getMessage(receiverUserId);
        return listM;
    }

//  更新事务状态
    @PatchMapping("/update")
    void updateStatus(@RequestParam("messageId") Integer messageId,@RequestParam("status") String status){
        matterService.UpdateStatus(messageId,status);

    }

//    插入处理记录
    @PostMapping("/addRecord")
    public ResponseEntity<?> addRecord(
            @RequestParam("messageId") Integer messageId,
            @RequestParam("processorUserId") Integer processorUserId,
            @RequestParam("id") String id,
            @RequestParam("processInfo") String processInfo,
            @RequestParam(value = "attachment", required = false) MultipartFile attachmentFile){
        System.out.println(id);
        // 将接收到的参数封装到业务实体对象中
        ProcessingRecord record = new ProcessingRecord();
        record.setMessageId(messageId);
        record.setProcessorUserId(processorUserId);
        record.setId(id);
        record.setProcessInfo(processInfo);
        try {
            ProcessingRecord createdRecord = matterService.createRecord(record, attachmentFile);

            return ResponseEntity.ok(createdRecord);

        } catch (IOException e) {

            e.printStackTrace();
            // 返回一个具体的错误信息给前端
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("文件上传失败: " + e.getMessage());
        } catch (Exception e) {

            e.printStackTrace();
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("创建处理记录失败: " + e.getMessage());
        }
    }

    @GetMapping("/detail")
    public ResponseEntity<?> getMessageDetail(@RequestParam("messageId") Integer messageId) {
        MessageDetailDTO detail = matterService.getMessageDetailById(messageId);
        if (detail == null) {
            return ResponseEntity.status(HttpStatus.NOT_FOUND).body("未找到ID为 " + messageId + " 的事务");
        }
        return ResponseEntity.ok(detail);
    }

    @GetMapping("/file")
    public ResponseEntity<byte[]> getFile(@RequestParam("messageId") String messageId) {
        // 1. 调用 Service 获取文件信息 DTO
        FileDTO fileDTO = matterService.getFileByMessageId(messageId);

        // 2. 处理文件不存在的情况
        if (fileDTO == null || fileDTO.getFileData() == null) {
            // 返回 404 Not Found
            return ResponseEntity.notFound().build();
        }

        String fileName = fileDTO.getFileName();
        System.out.println(fileDTO.getFileName());
        // 3. 构建 HTTP 响应头
        HttpHeaders headers = new HttpHeaders();


        String contentType = fileDTO.getContentType() != null ? fileDTO.getContentType() : "application/octet-stream";
        headers.setContentType(MediaType.parseMediaType(contentType));

        ContentDisposition contentDisposition = ContentDisposition.builder("inline")
                .filename(fileDTO.getFileName(), StandardCharsets.UTF_8) // 必须是 fileDTO.getFileName()
                .build();

        headers.setContentDisposition(contentDisposition);
        // 4. 返回最终的 ResponseEntity，包含文件内容、响应头和 HTTP 状态 OK(200)
        return new ResponseEntity<>(fileDTO.getFileData(), headers, HttpStatus.OK);
    }

//    @GetMapping("/file/{messageId}") // 使用路径变量，例如 /matter/file/175127903425
//    public void getFileByMessageId(@PathVariable("messageId") String messageId, HttpServletResponse response) throws IOException {
//
//        // 1. 调用Service层，根据ID获取包含文件信息（文件名、文件数据）的DTO
//        //    这里的 FileDTO 是你之前定义的那个，包含 fileName 和 fileData
//        FileDTO fileDTO = matterService.getFileByMessageId(messageId);
//
//        // 2. 处理文件不存在的情况
//        if (fileDTO == null || fileDTO.getFileData() == null || fileDTO.getFileData().length == 0) {
//            // 设置HTTP状态码为 404 Not Found
//            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
//            // 可以选择性地写入错误信息
//            response.getWriter().write("Error: File not found or is empty.");
//            return;
//        }
//
//        // 3. 设置HTTP响应头 (这是关键)
//
//        // a. 设置内容类型 (MIME Type)。
//        //    为了最大的兼容性，可以直接使用 application/octet-stream，这会倾向于触发下载。
//        //    如果想更智能地让浏览器决定，可以尝试从文件名动态推断。
//        String contentType = "application/octet-stream";
//        // 你之前获取contentType的逻辑可以复用
//        if (fileDTO.getContentType() != null) {
//            contentType = fileDTO.getContentType();
//        }
//        response.setContentType(contentType);
//
//        // b. 设置文件名，并处理特殊字符和中文。
//        //    使用URLEncoder对文件名进行编码，这是标准做法。
//        String encodedFileName = URLEncoder.encode(fileDTO.getFileName(), StandardCharsets.UTF_8.toString()).replaceAll("\\+", "%20");
//
//        // c. 设置Content-Disposition头。
//        //    - 'inline': 建议浏览器在页面内预览（如果支持该文件类型，如PDF, JPG, TXT）。
//        //    - 'attachment': 强制浏览器弹出“另存为”对话框进行下载。
//        //    选择 'inline' 通常能提供更好的用户体验。
//        response.setHeader("Content-Disposition", "inline; filename=\"" + encodedFileName + "\"; filename*=UTF-8''" + encodedFileName);
//
//        // d. 设置内容长度，有助于浏览器显示下载进度。
//        response.setContentLength(fileDTO.getFileData().length);
//
//        // 4. 将文件二进制数据写入响应的输出流
//        response.getOutputStream().write(fileDTO.getFileData());
//        response.getOutputStream().flush(); // 确保所有数据都被发送
//    }
}
